package com.iuie.ns.frame.utils;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 关于反射的工具类
 * @author lj
 * @date 2017年1月1日下午7:33:51
 */
public class ReflectionUtils extends org.springframework.util.ReflectionUtils{

	private static Logger logger = LoggerFactory.getLogger(ReflectionUtils.class);

	/**
	 * 得到最近的父类型
	 * @createTime 2017年1月2日 下午3:30:10
	 * @param clazz
	 * @return
	 */
	public static Class<?> getClassGenricType(final Class<?> clazz) {
		return getClassGenricType(clazz, 0);
	}

	/**
	 * 得到往上数，第几级的父类型
	 * @createTime 2017年1月2日 下午3:31:13
	 * @param clazz
	 * @param index
	 * @return
	 */
	public static Class<?> getClassGenricType(final Class<?> clazz, final int index) {

		Type genType = clazz.getGenericSuperclass();

		if (!(genType instanceof ParameterizedType)) {
			logger.warn(clazz.getSimpleName()
					+ "'s superclass not ParameterizedType");
			return Object.class;
		}

		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

		if (index >= params.length || index < 0) {
			logger.warn("Index: " + index + ", Size of "
					+ clazz.getSimpleName() + "'s Parameterized Type: "
					+ params.length);
			return Object.class;
		}
		if (!(params[index] instanceof Class)) {
			logger.warn(clazz.getSimpleName()
					+ " not set the actual class on superclass generic parameter");
			return Object.class;
		}
		return (Class<?>) params[index];
	}

    /**
     * 获取类型
     * @param name
     * @throws SecurityException 
     * @throws NoSuchFieldException 
     * @date 2017年7月2日 下午3:09:17
     */
    public static Class<?> getDeclaredFieldType(String name, Class<?> clazz) throws NoSuchFieldException, SecurityException {
        return clazz.getDeclaredField(name).getType();
    }

}
